package cc.mrbird.febs.common.utils;

import cc.mrbird.febs.common.domain.FebsConstant;
import cc.mrbird.febs.common.domain.QueryRequest;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.lang3.StringUtils;

/**
 * MyBatis-Plus排序工具类
 * 用于处理分页查询和条件查询时的排序逻辑
 * 支持默认排序字段和排序规则，支持驼峰命名转下划线
 * 
 * @author MrBird
 */
@SuppressWarnings("unchecked")
public class SortUtil {
    /**
     * 处理分页查询的排序
     * 根据请求参数设置分页对象的排序规则
     * 如果请求中指定了排序字段和规则，则使用请求中的设置
     * 否则使用默认的排序字段和规则
     *
     * @param request 查询请求对象，包含排序字段和规则
     * @param page 分页对象，用于设置排序规则
     * @param defaultSort 默认排序字段
     * @param defaultOrder 默认排序规则（升序/降序）
     * @param camelToUnderscore 是否将驼峰命名转换为下划线命名
     */
    public static void handlePageSort(QueryRequest request, Page page, String defaultSort, String defaultOrder, boolean camelToUnderscore) {
        page.setCurrent(request.getPageNum());
        page.setSize(request.getPageSize());
        String sortField = request.getSortField();
        if (camelToUnderscore) {
            sortField = FebsUtil.camelToUnderscore(sortField);
            defaultSort = FebsUtil.camelToUnderscore(defaultSort);
        }
        if (StringUtils.isNotBlank(request.getSortField())
                && StringUtils.isNotBlank(request.getSortOrder())
                && !StringUtils.equalsIgnoreCase(request.getSortField(), "undefined")
                && !StringUtils.equalsIgnoreCase(request.getSortOrder(), "undefined")) {
            if (StringUtils.equals(request.getSortOrder(), FebsConstant.ORDER_DESC))
                page.setDesc(sortField);
            else
                page.setAsc(sortField);
        } else {
            if (StringUtils.isNotBlank(defaultSort)) {
                if (StringUtils.equals(defaultOrder, FebsConstant.ORDER_DESC))
                    page.setDesc(defaultSort);
                else
                    page.setAsc(defaultSort);
            }
        }
    }

    /**
     * 处理分页查询的排序（简化版）
     * 使用默认的排序设置（不指定排序字段和规则，不进行驼峰转换）
     *
     * @param request 查询请求对象
     * @param page 分页对象
     */
    public static void handlePageSort(QueryRequest request, Page page) {
        handlePageSort(request, page, null, null, false);
    }

    /**
     * 处理分页查询的排序（支持驼峰转换）
     * 使用默认的排序设置，但支持驼峰命名转下划线
     *
     * @param request 查询请求对象
     * @param page 分页对象
     * @param camelToUnderscore 是否将驼峰命名转换为下划线命名
     */
    public static void handlePageSort(QueryRequest request, Page page, boolean camelToUnderscore) {
        handlePageSort(request, page, null, null, camelToUnderscore);
    }

    /**
     * 处理条件查询的排序
     * 根据请求参数设置查询条件的排序规则
     * 如果请求中指定了排序字段和规则，则使用请求中的设置
     * 否则使用默认的排序字段和规则
     *
     * @param request 查询请求对象，包含排序字段和规则
     * @param wrapper 查询条件包装对象，用于设置排序规则
     * @param defaultSort 默认排序字段
     * @param defaultOrder 默认排序规则（升序/降序）
     * @param camelToUnderscore 是否将驼峰命名转换为下划线命名
     */
    public static void handleWrapperSort(QueryRequest request, QueryWrapper wrapper, String defaultSort, String defaultOrder, boolean camelToUnderscore) {
        String sortField = request.getSortField();
        if (camelToUnderscore) {
            sortField = FebsUtil.camelToUnderscore(sortField);
            defaultSort = FebsUtil.camelToUnderscore(defaultSort);
        }
        if (StringUtils.isNotBlank(request.getSortField())
                && StringUtils.isNotBlank(request.getSortOrder())
                && !StringUtils.equalsIgnoreCase(request.getSortField(), "undefined")
                && !StringUtils.equalsIgnoreCase(request.getSortOrder(), "undefined")) {
            if (StringUtils.equals(request.getSortOrder(), FebsConstant.ORDER_DESC))
                wrapper.orderByDesc(sortField);
            else
                wrapper.orderByAsc(sortField);
        } else {
            if (StringUtils.isNotBlank(defaultSort)) {
                if (StringUtils.equals(defaultOrder, FebsConstant.ORDER_DESC))
                    wrapper.orderByDesc(defaultSort);
                else
                    wrapper.orderByAsc(defaultSort);
            }
        }
    }

    /**
     * 处理条件查询的排序（简化版）
     * 使用默认的排序设置（不指定排序字段和规则，不进行驼峰转换）
     *
     * @param request 查询请求对象
     * @param wrapper 查询条件包装对象
     */
    public static void handleWrapperSort(QueryRequest request, QueryWrapper wrapper) {
        handleWrapperSort(request, wrapper, null, null, false);
    }

    /**
     * 处理条件查询的排序（支持驼峰转换）
     * 使用默认的排序设置，但支持驼峰命名转下划线
     *
     * @param request 查询请求对象
     * @param wrapper 查询条件包装对象
     * @param camelToUnderscore 是否将驼峰命名转换为下划线命名
     */
    public static void handleWrapperSort(QueryRequest request, QueryWrapper wrapper, boolean camelToUnderscore) {
        handleWrapperSort(request, wrapper, null, null, camelToUnderscore);
    }
}
